#pragma once
#include "Dispatcher.h"
#include "Channel.h"
#include <thread>
#include <queue>
#include <map>
#include <mutex>
#include <string>
#include "Log.h"
using namespace std;

// 前向声明
class Dispatcher;
// 这是强类型枚举，后面可以指定类型，如果不指定类型就是int 占4个字节
enum class ElementType : char
{
    ADD,
    DELETE,
    MODIFY,
};
// 定义一个链表
struct ChannelElement
{
    ElementType type; // 增加 删除 修改
    Channel *channel;
};

class EventLoop
{
public:
    EventLoop();
    EventLoop(const char *threadName);
    ~EventLoop();
    // 启动反应堆
    int run();
    // 处理激活得事件
    int eventActivate(int fd, int events);

    // 添加任务到任务队列
    // int type是指哪个结构体
    int AddTask(struct Channel *channel, ElementType type);
    // 处理任务队列中的任务
    int ProcessTask();
    // 处理dispatch中的节点
    int add(Channel *channel);
    int remove(Channel *channel);
    int modify(Channel *channel);
    int freeChannel(Channel *channel);

private:
    bool m_isQuit;
    // 该指针指向子类实例 epoll poll select
    Dispatcher *m_dispatcher;
    // 任务队列
    queue<ChannelElement *> m_taskQ;
    // 映射关系
    map<int, Channel *> m_channelMap;
    // 线程ID
    thread::id m_threadId;
    // 线程名字
    string m_threadname;

    // c互斥锁
    mutex m_mutex;
    //
    int m_sockfdPair[2]; // 存储本地通信的fd 通过socketpair初始化
};
